其他
重要的节日那么多,要及时「缓存」你们的珍贵时光
The following article is from 程序员cxuan Author 后端学长
作者 | 后端学长
责编 | Carol
出品 | 程序员 cxuan
缓存
的作用。在如今互联网的世界里随着互联网的普及,内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时我们的应用服务器
和数据库服务器
所做的计算也越来越多。缓冲区(称作Cache)
,这个概念最初是来自于内存和 CPU。当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接使用执行,缓存找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。缓存的分类
缓存失效
缓存失效
场景一
:这种情况下一般不会对数据库造成比较严重的影响,因为失效的 key 的数量比较少,即使同时请求到数据库层面也是可以接受的。场景二
:在这种场景中,当缓存里面的大量 Key同时
失效,这个时候如果有请求过来,会穿过失效的 Key全部落到数据库层面。导致数据库的负荷瞬间添加。可能会出现数据库宕机等特大事故。
解决方案
缓存击穿
缓存穿透
。解决方案一
首先我们能想到的就是在网关参数进行过滤。校验请求的 key 是否是我们系统 key 的格式等
当然这网关层所能做到的只是一些简单过滤。每个后端的设计人员应该对服务的可用性和健壮性负责。接下来我们看看服务端应该如何处理
服务端可以将不存在的 key 暂时保存到我们的缓存中,再次接收到同样的请求后如果直接命中缓存并且值为空那么就会直接返回,不会穿透到数据库层面,这样就避免了缓存击穿。
但是黑客/恶意攻击者是不会这么轻易被打发的。每次请求都会传不同的 key 来攻击我们的服务。这个时候这个方案起不到作用了。
解决方案二
BloomFilter(布隆过滤器)
缓存过滤器,记录全量数据。这样访问数据时,可以直接通过 BloomFilter 判断这个 key 是否存在,如果不存在直接返回即可,根本无需查缓存和 DB。这样在缓存之前加了一层校验。如果key 值不存在,就不会请求到我们的缓存更加不会到我们的数据库中。布隆过滤器可以理解为一个不怎么精确的 set
结构,当你使用它的 contains 方法判断某个对象是否存在时,它可能会误判。但是布隆过滤器也不是特别不精确,只要参数设置的合理,它的精确度可以控制的相对足够精确,只会有小小的误判概率。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。即使误判不存在走到缓存和后端服务也是可以接受的。
缓存雪崩
一种就是简单的主从例如 redis 的哨兵之殇 采取一致性 hash 算法集群部署例如 redis 的分片集群
解决方案
对缓存体系进行实时监控,当请求访问的慢速比超过阀值时,及时报警,通过机器替换、服务替换进行及时恢复。 对缓存增加多个副本,缓存异常或请求 miss 后,再读取其他缓存副本。 ehcache 本地缓存 + Hystrix 限流&降级,避免 MySQL被打死 业务 DB 的访问增加读写开关,当发现 DB 请求变慢、阻塞,慢请求超过阀值时,就会关闭读开关,部分或所有读 DB 的请求进行 failfast 立即返回,待 DB 恢复后再打开读开关。
数据不一致
解决方案
总结